// 游戏相关信息的仓库
import vue from "vue";
import getRandom from "@/utils/getRandom";
import delay from "@/utils/delay";
import isMobile from "@/utils/isMobile";

export default {
  namespaced: true, // 开启命名空间
  state: {
    // 游戏是否已经开始 <false>
    isStarted: false,
    // 设备是否为移动端 <true>
    isMobile: isMobile(),
    // 是否是关卡模式 <false>
    isLevelMode: false,
    // 是否显示设置窗口 <false>
    isShowSetting: false,
    // 是否禁止点击卡片(也会禁止点击 开始游戏 和 关卡模式 按钮) <false>
    isBanCardClick: false,
    // 是否禁止点击关卡模式按钮 <false>
    isBanLevelModeBtn: false,
    // 是否是简单模式 <true>
    isEasy: true,
    // 游戏是否一定有解 [当前已弃用, 因为容易无解的模式没有意义] <true>
    isCorrect: true,
    // 是否开启游戏声音 <true>
    isVolume: true,
    // 是否使用彩色卡片 <true>
    isColor: true,
    // 是否显示生成动画 <true>
    isAnim: true,
    // 得分 <0>
    score: 0,
    // 游戏时间 <0>
    time: 0,
    // 中间弹窗距顶部的高度 <146>
    popOffset: isMobile() ? 146 : 60,
    // 游戏区 宽度/高度 [密排的情况下每 行/列 的最大的卡片数] <10/10>
    size: {
      w: 10,
      h: 10,
    },
    // 卡槽容量 <6>
    slotMaxNum: 6,
    // 卡槽中每次消除卡片的个数 <3>
    clearCard: 3,
    // 卡片id [每生成一张卡片id+1, 也用于表示堆叠, 数值越大表示越靠上] <0>
    cardId: 0,
    // PC端卡片尺寸 <50>
    cardSize: 50,
    // 移动端卡片尺寸 <42>
    cardSize2: 42,
    // 初始卡片数 <132>
    cardNum: 132,
    // 选择的卡片类型 <0~10> [一共有0~17种图标]
    cardTypes: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    // 卡片类型的总数 [以cards中的cardData的length为准] <18>
    cardTypeTotal: 18,
    // 是否降低卡片重叠的概率 <false>
    isReduceOverlap: false,
    // 卡片获取率
    cardProb: 0.15,
    // run js编辑器的内容 [文本域内容]
    textarea: "",
    // 是否自动添加卡片 <false>
    isAutoAddCard: false,
    // 自动添加卡片的时间间隔 [单位ms] <3000>
    duration: 3000,
    // 游戏区中所有的卡片
    gameCards: [
      // {
      //   cardId: 0,
      //   iconId: 0,
      //   coor: {
      //     x: 1,
      //     y: 7,
      //   },
      // },
    ],
    // 游戏区中的每一张卡片是否该显示 [对象中以cardId为键]
    gameIsShowCards: {
      // 0: true,
    },
    // 卡槽中所有的卡片
    slotCards: [
      // {
      //   cardId: 5,
      //   iconId: 0,
      //   coor: { x: xxx, y: xxx }
      // },
    ],
    // 卡槽中的每一张卡片是否该显示
    slotIsShowCards: {
      // 5: true,
    },
    // 命令的数据存储区域
    cmdData: {
      num1: 0,
      num2: 0,
      num3: 0,
      str1: "",
      str2: "",
      str3: "",
      arr1: [],
      arr2: [],
      arr3: [],
      obj1: {},
      obj2: {},
      obj3: {},
      fn1: "",
      fn2: "",
      fn3: "",
    },
  },
  mutations: {
    // $store.commit("info/setIsStarted", true); // 组件中调用示例

    // 设置游戏是否开始
    setIsStarted(state, payload) {
      state.isStarted = payload;
    },
    // 设置当前设备是否为移动端
    setIsMobile(state, payload) {
      state.isMobile = payload;
    },
    // 设置是否处在关卡模式
    setIsLevelMode(state, payload) {
      state.isLevelMode = payload;
    },
    // 设置设置窗口是否显示
    setIsShowSetting(state, payload) {
      state.isShowSetting = payload;
    },
    // 设置是否禁止点击卡片
    setIsBanCardClick(state, payload) {
      state.isBanCardClick = payload;
    },
    // 设置是否禁止点击关卡模式按钮
    setIsBanLevelModeBtn(state, payload) {
      state.isBanLevelModeBtn = payload;
    },
    // 设置是否是简单模式
    setIsEasy(state, payload) {
      state.isEasy = payload;
    },
    // 设置是否开启游戏声音
    setIsVolume(state, payload) {
      state.isVolume = payload;
      console.log(payload ? "声音已开启" : "声音已关闭");
    },
    // 设置是否使用彩色卡片
    setIsColor(state, payload) {
      state.isColor = payload;
    },
    // 设置是否开启生成动画
    setIsAnim(state, payload) {
      state.isAnim = payload;
    },
    // 设置游戏区的宽度
    setSizeW(state, payload) {
      state.size.w = payload;
    },
    // 设置游戏区的高度
    setSizeH(state, payload) {
      state.size.h = payload;
    },
    // 设置卡槽容量
    setSlotMaxNum(state, payload) {
      state.slotMaxNum = payload;
    },
    // 设置卡槽中每次消除卡片的个数
    setClearCard(state, payload) {
      state.clearCard = payload;
    },
    // 设置卡片id
    setCardId(state, payload) {
      state.cardId = payload;
    },
    // 设置PC端卡片尺寸
    setCardSize(state, payload) {
      state.cardSize = payload;
    },
    // 设置移动端卡片尺寸
    setCardSize2(state, payload) {
      state.cardSize2 = payload;
    },
    // 设置初始卡片数
    setCardNum(state, payload) {
      state.cardNum = payload;
    },
    // 设置选择的卡片类型
    setCardTypes(state, payload) {
      // 传入选择的类型总数 [会随机选择相应数量的卡片]
      // const arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]; // 所有图标id
      const arr = [];
      for (let i = 0; i < state.cardTypeTotal; i++) {
        arr.push(i);
      }
      state.cardTypes = [];
      const len = arr.length;
      for (let i = 0; i < len - payload; i++) {
        arr.splice(getRandom(0, arr.length - 1), 1); // 删除第i项
      }
      state.cardTypes = arr;
    },
    // 设置卡片类型的总数
    setCardTypeTotal(state, payload) {
      state.cardTypeTotal = payload;
    },
    // 设置是否降低卡片重叠概率
    setIsReduceOverlap(state, payload) {
      state.isReduceOverlap = payload;
    },
    // 设置卡片获取率
    setCardProb(state, payload) {
      state.cardProb = payload;
    },
    // 设置文本域内容
    setTextarea(state, payload) {
      state.textarea = payload;
    },
    // 设置是否自动添加卡片
    setIsAutoAddCard(state, payload) {
      state.isAutoAddCard = payload;
    },
    // 设置自动添加卡片的时间间隔
    setDuration(state, payload) {
      state.duration = payload;
    },
    // 设置游戏区卡片的坐标
    setGameCardCoor(state, payload) {
      // payload: {i:xxx, coor: {x:xxx, y:xxx}}
      state.gameCards[payload.i].coor = payload.coor;
    },
    // 设置游戏区卡片的cardId
    setGameCardCard(state, payload) {
      // payload: {i:xxx, cardId: xxx}
      state.gameCards[payload.i].cardId = payload.cardId;
    },
    // 设置游戏区卡片的iconId
    setGameCardIcon(state, payload) {
      // payload: {i:xxx, iconId: xxx}
      state.gameCards[payload.i].iconId = payload.iconId;
    },
    // 设置卡槽中卡片的iconId
    setSlotCardIcon(state, payload) {
      // payload: {i:xxx, iconId: xxx}
      state.slotCards[payload.i].iconId = payload.iconId;
    },
    // 在游戏区增加一张卡片
    addGameCard(state, payload) {
      // payload: {cardId: xxx, iconId: xxx, coor: {x: xxx, y: xxx}}
      payload.place = 0;
      state.gameCards.push(payload); // 加入卡片数组中
      state.gameIsShowCards[payload.cardId + ""] = true; // 加入显示对象中
    },
    // 在卡槽中增加一张卡片
    addSlotCard(state, payload) {
      // payload: {cardId: xxx, iconId: xxx, coor: {x: xxx, y: xxx}}
      payload.place = 1;
      state.slotCards.push(payload);
      state.slotIsShowCards[payload.cardId + ""] = true;
    },
    // 删除游戏区的卡片
    deleteGameCard(state, payload) {
      if (payload === -1) {
        state.gameCards = []; // 清空卡片
        return;
      }
      // 传入要删除的索引
      const card = state.gameCards[payload];
      delete state.gameIsShowCards[card.cardId + ""]; // 从显示对象中删除
      state.gameCards.splice(payload, 1); // 从卡片数组中删除
    },
    // 删除卡槽的卡片
    deleteSlotCard(state, payload) {
      if (payload === -1) {
        state.slotCards = []; // 清空卡片
        return;
      }
      // 传入要删除的索引
      const card = state.slotCards[payload];
      if (!card) {
        return;
      }
      delete state.slotIsShowCards[card.cardId + ""]; // 从显示对象中删除
      state.slotCards.splice(payload, 1); // 从卡片数组中删除
    },
    // 打印命令数据仓库中的变量的值
    clg(state, payload) {
      // 传入变量名
      vue.$consolelog(state.cmdData[payload]);
    },
    // 设置命令仓库中的变量的值
    setVar(state, payload) {
      // {
      //   name: varName,
      //   data: xxxx,
      // }
      state.cmdData[payload.name] = payload.data;
    },
    // 设置命令仓库中的函数
    setFn(state, payload) {
      // {
      //   name: varName,
      //   fn: "function(){const arr=[];for(let i=0;i<3;i++){arr.push(i)};return arr;"
      // }
      var func = new Function("return " + payload.fn)();
      state.cmdData[payload.name] = func;
    },
    // 执行命令仓库中的一个函数
    runfn(state, payload) {
      // {fn: funcName, args: [xxx,xxx]}
      state.cmdData[payload.fn](payload.args);
    },
    // 游戏重置
    gameReset(state) {
      state.cardId = 0;
      state.gameCards = [];
      state.gameIsShowCards = {};
      state.slotCards = [];
      state.slotIsShowCards = {};
    },
  },
  actions: {
    // async fetchBanner(ctx) {
    //   if (ctx.state.data.length) {
    //     // 如果已经获取过数据, 则不再发送请求
    //     return;
    //   }
    // },
  },
};
